/**
 * 
 */


#include "../../include/tcpServer/TcpServer.h"
#include "../../include/tcpServer/TcpConnection.h"
#include "../../include/tcpServer/Task.h"
#include "../../include/webPage/WebPageReader.h"
#include "../../include/dict/dictionary.h"
#include "../../include/mylog.h"


/**
 * TcpServer implementation
 */

/**
 * @param ip
 * @param port
 * @param threadNumber
 * @param queueSize
 */
// TcpServer 先把线程池创建初始化  和 Acceptor 作为连接进行初始化。还有事件循环开始。 
TcpServer::TcpServer(const string& ip, unsigned short port, 
                     size_t threadNumber, size_t queueSize)
:_pool(threadNumber, queueSize)
,_acceptor(ip, port)
,_loop(_acceptor) // 
{
}

/**
 * @return void
 */
// 
using namespace std::placeholders;
// 对线程池开始初始化。 并设置回调函数。 
void TcpServer::start() {
    // 开启线程池 ：  1. 初始化num个线程并将线程要做的任务，注册到线程的回调函数。线程的threadFuncha函数就是去执行回调任务的函数。  2. 线程 
    _pool.start();

    _loop.setCallback(std::bind(&TcpServer::onConnectionCb, this, _1)
                      ,std::bind(&TcpServer::onMessageCb, this, _1)
                      ,std::bind(&TcpServer::onCloseCb, this, _1));

    _loop.loop();
    return;
}

/**
 * @return void
 */
void TcpServer::stop() {
    _pool.shutdown();
    _loop.unloop();
    return;
}


void TcpServer::onConnectionCb(const TcpConnectionPtr & pCon){
    LogInfo("%s has connected", pCon->toString().c_str());
}
// 在tcpserver 的消息回调函数里面往池里面添加任务。 
void TcpServer::onMessageCb(const TcpConnectionPtr & pCon){
    string msg = pCon->receive(); // 对方有消息传过来。 
    Task task(pCon, msg); //  传到任务里面供process之后让计算线程处理。 
    _pool.addTask(std::bind(&Task::pocess, task, _1)); // bind 绑定类的成员函数时，第二个参数是类的对象的地址。  第三个参数是占位符。 


}
void TcpServer::onCloseCb(const TcpConnectionPtr & pCon){
    LogInfo("%s has closed", pCon->toString().c_str());
}

